package com.qrx.struct.linkList.code;

import javax.xml.soap.Node;

/**
 * @content 链表实现
 */
public class LinkedList {

    /**
     *  初始化链表
     * @param
     * @param <E>
     */
    public <E> LNode<E>  initLinKedList(){
        return new LNode<E>(null,null,null);
    }

    /**
     * 获取第i个元素的值
     * @param head
     * @param index
     * @return
     * @param <E>
     */
    public <E> E GetElement(LNode<E> head, int index){
        LNode<E> p = head.next; //首元节点
        int j=1; //计数器
        while (p !=null && j < index){
            p = p.next;
            j++; //计算器加
        }
        if (j>index)
        {
            return  null;
        }
        return p.data;

    }

    /**
     * 获取链表元素节点
     * @param head
     * @param e
     * @return
     * @param <E>
     */
    public <E> LNode<E> LocateElement(LNode<E> head, E e){
        LNode<E> p = head.next;
        while (p!=null && !p.data.equals(e))
        {
            p=p.next;

        }
        return  p;
    }
    /**
     * 插入元素指定第i个元素
     * @param head
     * @param index
     * @param e
     */
    public <E> void InsertElement(LNode<E> head, int index, E e){

        LNode<E> p=head;
        int j=0;
        while (p!=null && j<index-1){
            p=p.next;
            j++;
        }
        if (p==null||j>index-1)
        {
            return;
        }
        LNode<E> s = new LNode(e,null,null);
        s.next = p.next;
        p.next =s;
        s.prev= p;

    }

    /**
     * 删除链表指定第i个元素
     * @param head 头节点
     * @param index 第几个元素
     * @param <E>
     */
    public <E> void DeleteElement(LNode<E> head, int index){

        LNode<E> p = head;
        int j =0;
        while (p.next!=null && j<index-1)
        {
            p=p.next;
            j++;
        }
        if (j>index-1||p.next==null)
        {
            return;
        }
        LNode<E> q =p.next;
        p.next = q.next;
        q.next.prev =p;
        q.next=null;
        q.prev=null;
    }

    public <E> void PrintElements(LNode<E> head){

        LNode<E> p = head.next;
        while (p!=null)
        {
            System.out.print(p.data+" ");
            p=p.next;
        }
        System.out.println();
    }



}


